//============================================================================
// Name        : PageRankMain.cpp
// Author      : lucmir@dcc.ufmg.br
// Description :
//============================================================================

#include <algorithm>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iterator>
#include <ext/hash_map>
#include <cmath>
#include <stack>
#include <string>
#include <time.h>
#include <vector>

#include "TimeMeasurement.h"
#include "PageRank.h"


bool getArgs(int argc, char** argv, char **inFileName, char **outFileName);


int main(int argc, char *argv[]) {

	// Get parameters
	char *inFileName = NULL, *outFileName = NULL;
	if ( !getArgs(argc, argv, &inFileName, &outFileName) ) {
		return EXIT_SUCCESS;
	}

	std::cout << "\n>> PROGRAMA PARA CALCULO DE PAGE RANK <<\n\n";

	// Open files
	std::ifstream inFile;
	inFile.open(inFileName);
	if(!inFile.is_open()) {
		std::cout << "\nERRO: Não foi possível abrir o arquivo: " << inFileName << "\n";
		return EXIT_SUCCESS;
	}
	std::ofstream outFile;
	outFile.open(outFileName);
	if (!outFile.is_open()) {
		std::cout << "\nERRO: Não foi possível abrir o arquivo: " << outFileName << "\n";
		return EXIT_SUCCESS;
	}

	std::cout << "Calculando PageRank...\n";

	// Start time measurement
	TimeMeasurement tm;
	tm.setUsrTime();
	tm.setSysTime();
	tm.setTotalTime();

	// Calculate PageRanks
	PageRank::calculatePageRank(inFile, outFile);

	// Finish time measurement
	tm.setUsrTime();
	tm.setSysTime();
	tm.setTotalTime();

	std::cout << "Concluído! Arquivo gerado: \"" << outFileName << "\"\n";
	tm.print();

	// Close files
	outFile.close();
	inFile.close();

	return EXIT_SUCCESS;
}


void usage() {
	std::cout << "\n\tPrograma para cálculo de PageRank a partir dos links entre documentos.\n\n"
		<< "\tParâmetros:\n"
		<< "\t\t-i <entrada - arquivo com links>\n"
		<< "\t\t-p <saída - arquivo de saída>\n\n";
}


bool getArgs(int argc, char** argv, char **inFileName, char **outFileName) {
	int opt;
	while((opt = getopt(argc,argv,"i:p:h"))!=-1) {
		switch(opt) {
			case 'h':
				usage();
				return false;
			case 'i':
				*inFileName = optarg;
				break;
			case 'p':
				*outFileName = optarg;
				break;
			default:
				usage();
				return false;
		}
	}
	if (*inFileName == NULL || *outFileName == NULL) {
		usage();
		return false;
	}
	return true;
}

